home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyo (Python 2.5)
-
- import inspect
- from cStringIO import StringIO
- import ZSI
- import string
- import sys
- import getopt
- import urlparse
- import types
- import warnings
- from ZSI.wstools import WSDLTools
- from ZSI.ServiceContainer import ServiceSOAPBinding, SimpleWSResource, WSAResource
- from ZSI.generate import WsdlGeneratorError, Wsdl2PythonError
- from utility import TextProtect, GetModuleBaseNameFromWSDL, NCName_to_ClassName, GetPartsSubNames, TextProtectAttributeName
- from containers import BindingDescription
- from wsdl2python import MessageWriter, WriteServiceModule, MessageTypecodeContainer, SchemaDescription
-
- rsplit = lambda x, sep: (x[:x.rfind(sep)], x[x.rfind(sep) + 1:])
- if sys.version_info[0:2] == (2, 4, 0, 'final', 0)[0:2]:
-
- rsplit = lambda x, sep: x.rsplit(sep, 1)
-
-
- class SOAPService:
-
- def __init__(self, service):
- self.classdef = StringIO()
- self.initdef = StringIO()
- self.location = ''
- self.methods = []
-
-
- def newMethod(self):
- self.methods.append(StringIO())
- return self.methods[-1]
-
-
-
- class ServiceModuleWriter:
- indent = ' '
- server_module_suffix = '_server'
- func_aname = TextProtectAttributeName
- func_aname = staticmethod(func_aname)
- separate_messages = False
-
- def __init__(self, base = ServiceSOAPBinding, prefix = 'soap', service_class = SOAPService):
- if inspect.isclass(base):
- self.base_class_name = base.__name__
- self.base_module_name = inspect.getmodule(base).__name__
- else:
- (self.base_module_name, self.base_class_name) = base.rsplit('.', 1)
- self.wsdl = None
- self.method_prefix = prefix
- self._service_class = SOAPService
- self.header = None
- self.imports = None
- self.messages = []
- self._services = None
- self.types_module_path = None
- self.types_module_name = None
- self.messages_module_name = None
-
-
- def reset(self):
- self.header = StringIO()
- self.imports = StringIO()
- self.message = []
- self._services = { }
-
-
- def getIndent(self, level = 1):
- return self.indent * level
-
-
- def getMethodName(self, method):
- return '%s_%s' % (self.method_prefix, TextProtect(method))
-
-
- def getClassName(self, name):
- return NCName_to_ClassName(name)
-
-
- def setTypesModuleName(self, name):
- self.types_module_name = name
-
- setClientModuleName = setTypesModuleName
-
- def getTypesModuleName(self):
- if self.types_module_name is not None:
- return self.types_module_name
-
- wsm = WriteServiceModule(self.wsdl)
- return wsm.getTypesModuleName()
-
-
- def getServiceModuleName(self):
- name = GetModuleBaseNameFromWSDL(self.wsdl)
- if not name:
- raise WsdlGeneratorError, 'could not determine a service name'
-
- if self.server_module_suffix is None:
- return name
-
- return '%s%s' % (name, self.server_module_suffix)
-
-
- def getTypesModulePath(self):
- return self.types_module_path
-
- getClientModulePath = getTypesModulePath
-
- def setTypesModulePath(self, path):
- self.types_module_path = path
-
- setClientModulePath = setTypesModulePath
-
- def setUpClassDef(self, service):
- s = self._services[service.name].classdef
- print >>s, 'class %s(%s):' % (self.getClassName(service.name), self.base_class_name)
- print >>s, '%ssoapAction = {}' % self.getIndent(level = 1)
- print >>s, '%sroot = {}' % self.getIndent(level = 1)
-
-
- def setUpImports(self):
- i = self.imports
- print >>i, 'from ZSI.schema import GED, GTD'
- print >>i, 'from ZSI.TCcompound import ComplexType, Struct'
- module = self.getTypesModuleName()
- package = self.getTypesModulePath()
- if package:
- module = '%s.%s' % (package, module)
-
- print >>i, 'from %s import *' % module
- print >>i, 'from %s import %s' % (self.base_module_name, self.base_class_name)
-
-
- def setUpInitDef(self, service):
- sd = self._services[service.name]
- d = sd.initdef
- if sd.location is not None:
- (scheme, netloc, path, params, query, fragment) = urlparse.urlparse(sd.location)
- print >>d, "%sdef __init__(self, post='%s', **kw):" % (self.getIndent(level = 1), path)
- else:
- print >>d, '%sdef __init__(self, post, **kw):' % self.getIndent(level = 1)
- if self.base_module_name == inspect.getmodule(ServiceSOAPBinding).__name__:
- print >>d, '%s%s.__init__(self, post)' % (self.getIndent(level = 2), self.base_class_name)
- return None
-
- print >>d, '%s%s.__init__(self)' % (self.getIndent(level = 2), self.base_class_name)
-
-
- def mangle(self, name):
- return TextProtect(name)
-
-
- def getAttributeName(self, name):
- return self.func_aname(name)
-
-
- def setUpMethods(self, port):
- sd = self._services.get(port.getService().name)
- binding = port.getBinding()
- portType = port.getPortType()
- action_in = ''
- for bop in binding.operations:
-
- try:
- op = portType.operations[bop.name]
- except KeyError:
- ex = None
- raise WsdlGeneratorError, 'Port(%s) PortType(%s) missing operation(%s) defined in Binding(%s)' % (port.name, portType.name, bop.name, binding.name)
-
- for ext in bop.extensions:
- if isinstance(ext, WSDLTools.SoapOperationBinding):
- action_in = ext.soapAction
- break
- continue
-
- msgin = op.getInputMessage()
- msgin_name = TextProtect(msgin.name)
- method_name = self.getMethodName(op.name)
- m = sd.newMethod()
- print >>m, '%sdef %s(self, ps, **kw):' % (self.getIndent(level = 1), method_name)
- if msgin is not None:
- print >>m, '%srequest = ps.Parse(%s.typecode)' % (self.getIndent(level = 2), msgin_name)
- else:
- print >>m, '%s# NO input' % self.getIndent(level = 2)
- msgout = op.getOutputMessage()
- if msgout is not None:
- msgout_name = TextProtect(msgout.name)
- print >>m, '%sreturn request,%s()' % (self.getIndent(level = 2), msgout_name)
- else:
- print >>m, '%s# NO output' % self.getIndent(level = 2)
- print >>m, '%sreturn request,None' % self.getIndent(level = 2)
- print >>m, ''
- print >>m, "%ssoapAction['%s'] = '%s'" % (self.getIndent(level = 1), action_in, method_name)
- print >>m, "%sroot[(%s.typecode.nspname,%s.typecode.pname)] = '%s'" % (self.getIndent(level = 1), msgin_name, msgin_name, method_name)
-
-
-
- def setUpHeader(self):
- print >>self.header, '#' * 50
- print >>self.header, '# file: %s.py' % self.getServiceModuleName()
- print >>self.header, '#'
- print >>self.header, '# skeleton generated by "%s"' % self.__class__
- print >>self.header, '# %s' % ' '.join(sys.argv)
- print >>self.header, '#'
- print >>self.header, '#' * 50
-
-
- def write(self, fd = sys.stdout):
- print >>fd, self.header.getvalue()
- print >>fd, self.imports.getvalue()
- print >>fd, '# Messages ',
- for m in self.messages:
- print >>fd, m
-
- print >>fd, ''
- print >>fd, ''
- print >>fd, '# Service Skeletons'
- for k, v in self._services.items():
- print >>fd, v.classdef.getvalue()
- print >>fd, v.initdef.getvalue()
- for s in v.methods:
- print >>fd, s.getvalue()
-
-
-
-
- def fromWSDL(self, wsdl):
- if len(wsdl.services) == 0:
- raise WsdlGeneratorError, 'No service defined'
-
- self.reset()
- self.wsdl = wsdl
- self.setUpHeader()
- self.setUpImports()
- for service in wsdl.services:
- sd = self._service_class(service.name)
- self._services[service.name] = sd
- for port in service.ports:
- desc = BindingDescription(wsdl = wsdl)
-
- try:
- desc.setUp(port.getBinding())
- except Wsdl2PythonError:
- ex = None
- continue
-
- for soc in desc.operations:
- if not soc.hasInput():
- continue
-
- self.messages.append(MessageWriter())
- self.messages[-1].setUp(soc, port, input = True)
- if soc.hasOutput():
- self.messages.append(MessageWriter())
- self.messages[-1].setUp(soc, port, input = False)
- continue
-
- for e in port.extensions:
- if isinstance(e, WSDLTools.SoapAddressBinding):
- sd.location = e.location
- continue
-
- self.setUpMethods(port)
-
- self.setUpClassDef(service)
- self.setUpInitDef(service)
-
-
-
-
- class WSAServiceModuleWriter(ServiceModuleWriter):
-
- def __init__(self, base = WSAResource, prefix = 'wsa', service_class = SOAPService, strict = True):
- ServiceModuleWriter.__init__(self, base, prefix, service_class)
- self.strict = strict
-
-
- def createMethodBody(msgInName, msgOutName, **kw):
- body = []
- if msgInName is not None:
- body.append('request = ps.Parse(%s.typecode)' % msgInName)
-
- if msgOutName is not None:
- body.append('return request,%s()' % msgOutName)
- else:
- body.append('return request,None')
- return tuple(body)
-
- createMethodBody = staticmethod(createMethodBody)
-
- def setUpClassDef(self, service):
- s = self._services[service.name].classdef
- print >>s, 'class %s(%s):' % (self.getClassName(service.name), self.base_class_name)
- print >>s, '%ssoapAction = {}' % self.getIndent(level = 1)
- print >>s, '%swsAction = {}' % self.getIndent(level = 1)
- print >>s, '%sroot = {}' % self.getIndent(level = 1)
-
-
- def setUpMethods(self, port):
- binding = port.getBinding()
- portType = port.getPortType()
- service = port.getService()
- s = self._services[service.name]
- for bop in binding.operations:
-
- try:
- op = portType.operations[bop.name]
- except KeyError:
- ex = None
- raise WsdlGeneratorError, 'Port(%s) PortType(%s) missing operation(%s) defined in Binding(%s)' % (port.name, portType.name, op.name, binding.name)
-
- soap_action = None
- wsaction_in = None
- wsaction_out = None
- if op.input is not None:
- wsaction_in = op.getInputAction()
-
- if op.output is not None:
- wsaction_out = op.getOutputAction()
-
- for ext in bop.extensions:
- if isinstance(ext, WSDLTools.SoapOperationBinding) is False:
- continue
-
- soap_action = ext.soapAction
- if not soap_action:
- break
-
- if wsaction_in is None:
- break
-
- if wsaction_in == soap_action:
- break
-
- if self.strict is False:
- warnings.warn('Port(%s) operation(%s) in Binding(%s) soapAction(%s) != WS-Action(%s)' % (port.name, op.name, binding.name, soap_action, wsaction_in))
- break
-
- raise WsdlGeneratorError, 'Port(%s) operation(%s) in Binding(%s) soapAction(%s) MUST match WS-Action(%s)' % (port.name, op.name, binding.name, soap_action, wsaction_in)
-
- method_name = self.getMethodName(op.name)
- m = s.newMethod()
- print >>m, '%sdef %s(self, ps, address):' % (self.getIndent(level = 1), method_name)
- msgin_name = None
- msgout_name = None
- msgin = op.getInputMessage()
- msgout = op.getOutputMessage()
- if msgin is not None:
- msgin_name = TextProtect(msgin.name)
-
- if msgout is not None:
- msgout_name = TextProtect(msgout.name)
-
- indent = self.getIndent(level = 2)
- for l in self.createMethodBody(msgin_name, msgout_name):
- print >>m, indent + l
-
- print >>m, ''
- print >>m, "%ssoapAction['%s'] = '%s'" % (self.getIndent(level = 1), wsaction_in, method_name)
- print >>m, "%swsAction['%s'] = '%s'" % (self.getIndent(level = 1), method_name, wsaction_out)
- print >>m, "%sroot[(%s.typecode.nspname,%s.typecode.pname)] = '%s'" % (self.getIndent(level = 1), msgin_name, msgin_name, method_name)
-
-
-
-